package com.recommended.dto;


import java.io.Serializable;
import java.util.List;

/**
 * @author Wang JunJie
 * @date 2018/6/26.
 */
public class Page<T> implements Serializable {

    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = 1L;
    /**
     * 默认页码
     */
    public static final int DEFAULT_PAGE_NO = 1;
    /**
     * 默认页容量
     */
    public static final int DEFAULT_PAGE_SIZE = 20;

    /**
     * 当前页码
     */
    private int pageNo;
    /**
     * 页容量
     */
    private int pageSize;
    /**
     * 总记录
     */
    private int totalCount;
    /**
     * 总页数
     */
    private int totalPage;
    /**
     * 数据集合
     */
    private List<T> list;

    /**
     * 默认，初始化pageNo=1，pageSize=20
     */
    public Page() {
        // 一定要先设置页容量
        this.setPageSize(DEFAULT_PAGE_SIZE);
        this.setPageNo(DEFAULT_PAGE_NO);
    }

    /**
     * 带有页码，页容量参数的构造函数
     */
    public Page(int pageNo, int pageSize) {
        Integer checkedPageSize = checkPageSize(pageSize);
        // 一定要先设置页容量
        this.setPageSize(checkedPageSize);
        this.setPageNo(pageNo);
    }

    /**
     * 带有页码，页容量，总记录，数据集合参数的构造函数
     *
     * @param pageNo     The current pageNo
     * @param pageSize   The page's size
     * @param totalCount The total record count
     * @param list       The record list
     */
    public Page(int pageNo, int pageSize, int totalCount, List<T> list) {
        Integer checkedPageSize = checkPageSize(pageSize);
        // 一定要先设置页容量
        this.setPageSize(checkedPageSize);
        this.setPageNo(pageNo);
        this.setTotalCount(totalCount);
        this.setList(list);
    }

    public int getPageNo() {
        return this.pageNo;
    }

    public void setPageNo(int pageNo) {
        if (pageNo <= 0) {
            this.pageNo = DEFAULT_PAGE_NO;
        } else {
            this.pageNo = pageNo;
        }
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = checkPageSize(pageSize);
    }

    public int getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(int totalCount) {
        if (totalCount <= 0) {
            this.totalCount = 0;
        } else {
            this.totalCount = totalCount;
        }
    }

    public int getTotalPage() {
        this.totalPage = (getTotalCount() - 1) / getPageSize() + 1;
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        if (totalPage < 0) {
            this.totalPage = 0;
        } else {
            this.totalPage = totalPage;
        }
    }

    public List<T> getList() {
        return list;
    }

    public void setList(List<T> list) {
        this.list = list;
    }

    /**
     * 是否是第一页
     *
     * @return 是否
     */
    public boolean isFirstPage() {
        return this.pageNo <= 1;
    }

    /**
     * 是否是最后一页
     *
     * @return 是否
     */
    public boolean isLastPage() {
        return this.pageNo >= this.getTotalPage();
    }

    /**
     * 下一页
     *
     * @return 下一页页码
     */
    public int getNextPage() {
        if (this.isLastPage()) {
            return this.getTotalPage();
        }
        return this.pageNo + 1;
    }

    /**
     * 上一页
     *
     * @return 上一页页码
     */
    public int getPrevPage() {
        if (this.pageNo <= 1) {
            return 1;
        }
        return this.pageNo - 1;
    }

    /**
     * 获取第一条记录位置，用于数据库查询时设置的第一条记录
     */
    public int getFirstResult() {
        return (this.getPageNo() - 1) * this.getPageSize();
    }


    /**
     * 检查每页大小，不得超过100
     *
     * @param pageSize 每页大小
     * @return 若大于100，返回100，否则直接返回每页大小
     */
    private Integer checkPageSize(Integer pageSize) {
        Integer maxPageSize = 100;
        Integer minPageSize = 1;
        if (pageSize > maxPageSize) {
            return maxPageSize;
        }
        if (pageSize <= 0) {
            return minPageSize;
        }
        return pageSize;
    }

}
